Rows: 40
Columns: 10
$ position <chr> "faculty", "faculty", "faculty", "faculty", "fac…
$ recommend <chr> "Seminar and trainings involving everyone - can …
$ participation <chr> "0", "0", "0", "0", "0", "0", "1", "0", "1", "1"…
$ participation_specify <chr> NA, NA, NA, NA, NA, NA, "Fire and earthquake dri…
$ feedback <chr> NA, NA, "Closed the VSU premises by a proper, we…
$ traffic_light <dbl> 0, 1, 0, 1, 1, 0, 0, NA, 2, 1, 0, 0, 0, 1, 0, 0,…
$ age <dbl> 46, 32, 46, 26, 37, 37, NA, 22, 36, 32, 24, 24, …
$ sex <dbl> 0, 1, 1, 1, 0, 1, NA, 1, 0, 1, 0, 0, 0, 1, 1, 0,…
$ work_year <dbl> 2011, 2025, 2015, 2022, 2015, 2015, 1992, 2025, …
$ resident <dbl> 1, NA, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2,…
Rows: 25
Columns: 8
$ feedback <chr> NA, "No", NA, NA, "None", "None", NA, NA, NA, NA, "None"…
$ age <dbl> 18, 19, 19, 18, 18, 21, 20, 18, 21, 18, 19, 17, 18, 19, …
$ sex <dbl> 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,…
$ year <chr> "BSTM-2", "BSTM-2", "BSTM-2", "BSMET-1", "BSMET-1", "BCA…
$ location <dbl> 2, 2, 2, 2, NA, 2, 2, 2, 2, 2, 2, NA, 2, 2, 2, 2, 2, 2, …
$ safe_travel <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, NA, 3, 3, 3…
$ safety_exper <chr> NA, "No", "No", NA, "None", "None", "No", NA, NA, "No", …
$ traffic_light <dbl> 1, 0, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, NA, NA, 1, 1, …
Rows: 12
Columns: 7
$ suggestion <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ feedback <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "It's more s…
$ traffic_light <dbl> 1, NA, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1
$ age <dbl> 42, 42, 34, 53, 56, 57, 54, 54, 25, 25, 41, 41
$ sex <dbl> 0, 1, 1, 0, 1, NA, 1, 1, 1, 1, 1, 1
$ stakeholders <dbl> 1, 4, 4, 1, 4, 1, 1, 1, 6, 1, 1, 2
$ other_spec <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
Rows: 77
Columns: 18
$ position <chr> "faculty", "faculty", "faculty", "faculty", "fac…
$ recommend <chr> "Seminar and trainings involving everyone - can …
$ participation <chr> "0", "0", "0", "0", "0", "0", "1", "0", "1", "1"…
$ participation_specify <chr> NA, NA, NA, NA, NA, NA, "Fire and earthquake dri…
$ feedback <chr> NA, NA, "Closed the VSU premises by a proper, we…
$ traffic_light <dbl> 0, 1, 0, 1, 1, 0, 0, NA, 2, 1, 0, 0, 0, 1, 0, 0,…
$ age <dbl> 46, 32, 46, 26, 37, 37, NA, 22, 36, 32, 24, 24, …
$ sex <dbl> 0, 1, 1, 1, 0, 1, NA, 1, 0, 1, 0, 0, 0, 1, 1, 0,…
$ work_year <dbl> 2011, 2025, 2015, 2022, 2015, 2015, 1992, 2025, …
$ resident <dbl> 1, NA, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2,…
$ group <chr> "Faculty & Staff", "Faculty & Staff", "Faculty &…
$ year <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ safe_travel <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ safety_exper <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ suggestion <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ stakeholders <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ other_spec <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ location <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
Visayas State University: Campus Safety and Resilience Survey
1 Faculty and staff
1.1 Sociodemographic
Code
data_raw |>
select(position, age:resident, participation, traffic_light) |>
select(-work_year) |>
mutate(
resident = if_else(resident == 1, "In-campus", "Off-campus"),
participation = case_when(
participation %in% c(0, "0", "No") ~ "No",
participation %in% c(1, "1", "Yes") ~ "Yes",
TRUE ~ as.character(participation)),
traffic_light = case_when(
traffic_light == 0 ~ "No",
traffic_light == 1 ~ "Yes",
traffic_light == 2 ~ "Maybe",
TRUE ~ as.character(traffic_light))
) |>
tbl_summary(
by = position,
type = list(sex ~ "categorical",
participation = "categorical"),
missing_text = "Missing observation(s)"
) |>
bold_labels() %>%
as_kable_extra(linesep = "") %>%
kable_minimal() %>%
kable_styling(full_width = F, fixed_thead = T,
bootstrap_options = c("striped", "hover", "condensed", "responsive"))| Characteristic | faculty N = 20 |
staff N = 20 |
|---|---|---|
| age | 32 (24, 37) | 31 (29, 38) |
| Missing observation(s) | 2 | 0 |
| sex | ||
| 0 | 8 (44%) | 8 (42%) |
| 1 | 10 (56%) | 11 (58%) |
| Missing observation(s) | 2 | 1 |
| resident | ||
| In-campus | 7 (39%) | 3 (16%) |
| Off-campus | 11 (61%) | 16 (84%) |
| Missing observation(s) | 2 | 1 |
| participation | ||
| No | 15 (75%) | 9 (60%) |
| Yes | 5 (25%) | 6 (40%) |
| Missing observation(s) | 0 | 5 |
| traffic_light | ||
| Maybe | 1 (5.6%) | 5 (28%) |
| No | 12 (67%) | 1 (5.6%) |
| Yes | 5 (28%) | 12 (67%) |
| Missing observation(s) | 2 | 2 |
| 1 Median (Q1, Q3); n (%) |
1.2 Physical safety and security
Code
# plotting statement
pss_plt <-
item_statement_dta |>
filter(str_detect(categories, "Physical")) |>
ggplot(aes(x = perc, y = description, fill = response_fct)) +
geom_col(position = "fill", width = 0.7) +
geom_text(aes(label = scales::percent(perc, accuracy = 1)),
position = position_fill(vjust = 0.5),
color = "gray90",
size = 4,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("#073b4c", "#118ab2", "#06d6a0", "#ffd166", "#e63946")) +
coord_cartesian(clip = "off", expand = TRUE) +
facet_wrap(~position) +
labs(title = "Physical safety and security",
x = element_blank(),
y = element_blank(),
fill = "Response") +
custom_theme
# saving plot
ggsave(
plot = pss_plt,
filename = "plot/physical_saftey.jpeg",
dpi = 400,
height = 6,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/physical_saftey.jpeg")1.3 Emotional and professional safety
Code
# plotting statement
eps_plt <-
item_statement_dta |>
filter(str_detect(categories, "Emotional")) |>
ggplot(aes(x = perc, y = description, fill = response_fct)) +
geom_col(position = "fill", width = 0.7) +
geom_text(aes(label = scales::percent(perc, accuracy = 1)),
position = position_fill(vjust = 0.5),
color = "gray90",
size = 4,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("#073b4c", "#118ab2", "#06d6a0", "#ffd166", "#e63946")) +
coord_cartesian(clip = "off", expand = TRUE) +
facet_wrap(~position) +
labs(title = "Emotional and professional safety",
x = element_blank(),
y = element_blank(),
fill = "Response") +
custom_theme
# saving plot
ggsave(
plot = eps_plt,
filename = "plot/emotional_saftey.jpeg",
dpi = 400,
height = 6,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/emotional_saftey.jpeg")2 Student
2.1 Sociodemographic profile
Code
student_raw_dta |>
select(age:location) |>
mutate(
location = if_else(location == 1, "In-campus", "Off-campus"),
sex = if_else(sex == 0, "Male", 'Female')
) |>
tbl_summary(
type = list(sex ~ "categorical", age ~ "continuous"),
missing_text = "Missing observation(s)"
) |>
bold_labels() %>%
as_kable_extra(linesep = "") %>%
kable_minimal() %>%
kable_styling(full_width = F, fixed_thead = T,
bootstrap_options = c("striped", "hover", "condensed", "responsive"))| Characteristic | N = 25 |
|---|---|
| age | 18.00 (18.00, 19.00) |
| sex | |
| Female | 16 (64%) |
| Male | 9 (36%) |
| year | |
| BCAED-3 | 3 (12%) |
| BSA- 3 | 1 (4.0%) |
| BSA-2 | 1 (4.0%) |
| BSABE-2 | 1 (4.0%) |
| BSBIO-1 | 3 (12%) |
| BSBT-1 | 5 (20%) |
| BSCS-2 | 1 (4.0%) |
| BSDC-2 | 2 (8.0%) |
| BSED MATH | 1 (4.0%) |
| BSMET-1 | 3 (12%) |
| BSS-1 | 1 (4.0%) |
| BSTM-2 | 3 (12%) |
| location | |
| In-campus | 3 (13%) |
| Off-campus | 20 (87%) |
| Missing observation(s) | 2 |
| 1 Median (Q1, Q3); n (%) |
2.2 Travel safety
Code
safe_travel_plt <-
tibble(
safe_travel = c("Very unsafe", "Unsafe", "Safe", 'Very safe'),
n_count = c(0, 0, 23, 1)
) |>
mutate(fct_safe_travel = factor(safe_travel, levels = c("Very unsafe", "Unsafe", "Safe", 'Very safe'))) |>
mutate(n_percent = n_count / sum(n_count)) |>
ggplot(aes(y = fct_safe_travel, x = n_percent)) +
geom_col(width = 0.7, fill = "#073b4c") +
geom_text(aes(label = scales::percent(n_percent, accuracy = 1)),
hjust = 0,
color = "gray20",
size = 5,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format()) +
labs(y = element_blank(),
x = element_blank(),
title = "How safe do you feel traveling to and from VSU campus?") +
custom_theme
# saving plot
ggsave(
plot = safe_travel_plt,
filename = "plot/safe_travel.jpeg",
dpi = 400,
height = 5,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/safe_travel.jpeg")2.3 Traffic light
Code
st_traffic_light <-
student_raw_dta |>
select(traffic_light) |>
mutate(traffic_light = case_when(traffic_light == 0 ~ 'No',
traffic_light == 1 ~ 'Yes',
traffic_light == 2 ~ 'Maybe'
)) |>
count(traffic_light) |>
na.omit() |>
mutate(n_percent = n / sum(n)) |>
ggplot(aes(y = traffic_light, x = n_percent)) +
geom_col(width = 0.5, fill = "#073b4c") +
geom_text(aes(label = scales::percent(n_percent, accuracy = 1)),
hjust = 0,
color = "gray20",
size = 5,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format(), limits = c(0, 1)) +
labs(y = element_blank(),
x = element_blank(),
title = "Do you prefer to have traffic lights road in VSU?") +
custom_theme
# saving plot
ggsave(
plot = st_traffic_light,
filename = "plot/student_traffic_light.jpeg",
dpi = 400,
height = 8,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/student_traffic_light.jpeg")2.4 Physical safety and security
Code
# plotting statement
st_pss_plt <-
student_item_statement_dta |>
filter(str_detect(category, "Physical")) |>
ggplot(aes(x = perc, y = description, fill = response_fct)) +
geom_col(position = "fill", width = 0.7) +
geom_text(aes(label = scales::percent(perc, accuracy = 1)),
position = position_fill(vjust = 0.5),
color = "gray90",
size = 4,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("#073b4c", "#118ab2", "#06d6a0", "#ffd166", "#e63946")) +
coord_cartesian(clip = "off", expand = TRUE) +
labs(title = "Physical safety and security",
x = element_blank(),
y = element_blank(),
fill = "Response") +
custom_theme
# saving plot
ggsave(
plot = st_pss_plt,
filename = "plot/student_pyhiscal_safety.jpeg",
dpi = 400,
height = 8,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/student_pyhiscal_safety.jpeg")2.5 Emotional and psychological safety
Code
# plotting statement
st_eps_plt <-
student_item_statement_dta |>
filter(str_detect(category, "Emotional")) |>
ggplot(aes(x = perc, y = description, fill = response_fct)) +
geom_col(position = "fill", width = 0.7) +
geom_text(aes(label = scales::percent(perc, accuracy = 1)),
position = position_fill(vjust = 0.5),
color = "gray90",
size = 4,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("#073b4c", "#118ab2", "#06d6a0", "#ffd166", "#e63946")) +
coord_cartesian(clip = "off", expand = TRUE) +
labs(title = "Emotional and psychological safety",
x = element_blank(),
y = element_blank(),
fill = "Response") +
custom_theme
# saving plot
ggsave(
plot = st_eps_plt,
filename = "plot/student_emotional_safety.jpeg",
dpi = 400,
height = 8,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/student_emotional_safety.jpeg")2.7 Digital safety and emergency preparedness
Code
# plotting statement
st_digi_plt <-
student_item_statement_dta |>
filter(str_detect(category, "Social")) |>
ggplot(aes(x = perc, y = description, fill = response_fct)) +
geom_col(position = "fill", width = 0.7) +
geom_text(aes(label = scales::percent(perc, accuracy = 1)),
position = position_fill(vjust = 0.5),
color = "gray90",
size = 4,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("#073b4c", "#118ab2", "#06d6a0", "#ffd166", "#e63946")) +
coord_cartesian(clip = "off", expand = TRUE) +
labs(title = "Digital safety and emergency preparedness",
x = element_blank(),
y = element_blank(),
fill = "Response") +
custom_theme
# saving plot
ggsave(
plot = st_digi_plt,
filename = "plot/student_digital_emergency_safety.jpeg",
dpi = 400,
height = 6,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/student_digital_emergency_safety.jpeg")3 Guests and visitors
Code
# plotting guest experience
plt_experience_guest <-
guest_item_statement_dta |>
mutate(description = str_wrap(description, 40)) |>
ggplot(aes(x = pct, y = description, fill = response_fct)) +
geom_col(position = "fill", width = 0.7) +
geom_text(aes(label = scales::percent(pct, accuracy = 1)),
position = position_fill(vjust = 0.5),
color = "gray90",
size = 4,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("#073b4c", "#118ab2", "#ffd166", "#e63946")) +
coord_cartesian(clip = "off", expand = TRUE) +
labs(title = str_wrap("How was your experience during your visit to VSU?", 40),
x = element_blank(),
y = element_blank(),
fill = "Response") +
custom_theme
# saving plot
ggsave(
plot = plt_experience_guest,
filename = "plot/guest_visit_experience.jpeg",
dpi = 400,
height = 6,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/guest_visit_experience.jpeg")4 Combined data
4.1 Traffic light
Code
plt_combined_traffic_light <-
combined_data |>
select(group, traffic_light) |>
mutate(traffic_light = case_when(traffic_light == 0 ~ 'No',
traffic_light == 1 ~ 'Yes',
traffic_light == 2 ~ 'Maybe'
)) |>
count(group, traffic_light) |>
na.omit() |>
group_by(group) |>
mutate(n_percent = n / sum(n)) |>
ungroup() |>
mutate(group = factor(group, levels = c("Faculty & Staff", "Student", "Guest"))) |>
ggplot(aes(y = traffic_light, x = n_percent)) +
geom_col(width = 0.4, fill = "#073b4c") +
geom_text(aes(label = scales::percent(n_percent, accuracy = 1)),
hjust = -0.1,
color = "gray20",
size = 5,
fontface = "bold") +
scale_x_continuous(labels = scales::percent_format(), limits = c(0, 1)) +
coord_cartesian(clip = "off") +
facet_wrap(~group) +
labs(y = element_blank(),
x = element_blank(),
title = "Do you prefer to have traffic lights road in VSU?") +
custom_theme +
theme(strip.text = element_text(face = "bold"))
# saving plot
ggsave(
plot = plt_combined_traffic_light,
filename = "plot/combined_traffic_light.jpeg",
dpi = 400,
height = 5,
width = 10,
unit = "in"
)
# show plot
knitr::include_graphics("plot/student_traffic_light.jpeg")4.2 Recommendation and feedback
Code
# calculating word correlation from 'recommend' responses
word_cors <-
combined_data |>
select(recommend) |>
mutate(q_id = row_number()) |>
unnest_tokens(word, recommend) |>
anti_join(get_stopwords()) |>
pairwise_cor(word, q_id, sort = TRUE)
# plotting word correlation
set.seed(20251)
plt_recommend_bigram <-
word_cors %>%
filter(correlation > .2) %>%
as_tbl_graph() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = correlation), show.legend = FALSE) +
geom_node_point(color = "lightblue", size = 2) +
geom_node_text(aes(label = name), repel = TRUE) +
theme_void()
# saving word correlation
ggsave(plot = plt_recommend_bigram,
filename = "plot/recommend_word_correlation.jpeg", width = 8, height = 6, dpi = 300)
# displaying word correlation
knitr::include_graphics("plot/recommend_word_correlation.jpeg")
1.4 Social and community safety
Code